其他
终于有人把准确率、精度、召回率、均方差和R²都讲明白了
导读:在真实场景中,模型很少能成功地预测所有的内容。我们知道应该使用测试集的数据来评估我们的模型。但是这到底是如何工作的呢?
简短但不是很有用的答案是,这取决于模型。人们已经提出了各种评分函数,它可用于在所有可能的场景中评估训练模型。好消息是,很多评分函数实际上是scikit-learn的metrics模块的一部分。
让我们快速了解一些最重要的评分函数。
accuracy_score:准确率(accuracy)计算测试集中预测正确的数据点数,并返回正确预测的数据点的比例。以将图片分类为猫或狗为例,准确率表示正确分类为包含猫或狗的图片比例。该函数是最基本的分类器评分函数。 precision_score:精度(precision)描述了一个分类器不把包含狗的图片标记为猫的能力。或者说,在分类器认为测试集所有包含猫的图片中,精度是实际包含一只猫的图片比例。 recall_score:召回率(recall,或者敏感度)描述了一个分类器检索包含猫的所有图片的能力。或者说,测试集所有包含猫的图片中,召回率是正确识别为猫的图片比例。
import numpy as np
np.random.seed(42)
y_true = np.random.randint(0, 2, size=5)
y_true
array([0, 1, 0, 0, 0])
在文献中,这两类有时也被称为正样例(类标签是1的所有数据点)和负样例(其他所有数据点)。
y_pred = np.ones(5, dtype=np.int32)
y_pred
array([1, 1, 1, 1, 1], dtype=int32)
test_set_size = len(y_true)
predict_correct = np.sum(y_true == y_pred)
predict_correct / test_set_size
0.2
from sklearn import metrics
metrics.accuracy_score(y_true, y_pred)
0.2
在统计学假设检验中,假阳性也称为I型错误,而假阴性也称为II型错误。
truly_a_positive = (y_true == 1)
predicted_a_positive = (y_pred == 1)
# You thought it was a 1, and it actually was a 1
true_positive = np.sum(predicted_a_positive * truly_a_positive)
true_positive
1
# You thought it was a 1, but it was actually a 0
false_positive = np.sum((y_pred == 1) * (y_true == 0))
false_positive
4
# You thought it was a 0, but it actually was a 1
false_negative = np.sum((y_pred == 0) * (y_true == 1))
false_negative
0
# You thought it was a 0, and it actually was a 0
true_negative = np.sum((y_pred == 0) * (y_true == 0))
true_negative
0
accuracy = np.sum(true_positive + true_negative) / test_set_size
accuracy
0.2
precision = np.sum(true_positive) / np.sum(true_positive + false_positive)
precision
0.2
metrics.precision_score(y_true, y_pred)
0.2
recall = true_positive / (true_positive + false_negative)
recall
1.0
metrics.recall_score(y_true, y_pred)
1.0
mean_squared_error:对于回归问题,最常用的误差评估指标是对训练集中每个数据点的预测值和真实目标值之间的平方误差(所有数据点的平均值)进行度量。 explained_variance_score:一个更复杂的评估指标是度量一个模型对测试数据的变化或分配的可解释程度。通常使用相关系数度量可释方差的数量。 r2_score:R2得分(R平方)与可释方差得分密切相关,但使用一个无偏方差估计。它也被称为决定系数(coefficient of determination)。
x = np.linspace(0, 10, 100)
y_true = np.sin(x) + np.random.rand(x.size) - 0.5
y_pred = np.sin(x)
import matplotlib.pyplot as plt
plt.style.use('ggplot')
%matplotlib inline
plt.figure(figsize=(10, 6))
plt.plot(x, y_pred, linewidth=4, label='model')
plt.plot(x, y_true, 'o', label='data')
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc='lower left')
<matplotlib.legend.Legend at 0x7f3c2220f048>
mse = np.mean((y_true - y_pred) ** 2)
mse
0.08531839480842378
metrics.mean_squared_error(y_true, y_pred)
0.08531839480842378
fvu = np.var(y_true - y_pred) / np.var(y_true)
fvu
0.163970326266295
fve = 1.0 - fvu
fve
0.836029673733705
metrics.explained_variance_score(y_true, y_pred)
0.836029673733705
r2 = 1.0 - mse / np.var(y_true)
r2
0.8358169419264746
metrics.r2_score(y_true, y_pred)
0.8358169419264746
metrics.r2_score(y_true, np.mean(y_true) * np.ones_like(y_true))
Out:
0.0
关于作者:阿迪蒂亚·夏尔马(Aditya Sharma),罗伯特·博世(Robert Bosch)公司的一名高级工程师,致力于解决真实世界的自动计算机视觉问题。曾获得罗伯特·博世公司2019年人工智能编程马拉松的首名。
维什韦什·拉维·什里马利(Vishwesh Ravi Shrimali),于2018年毕业于彼拉尼博拉理工学院(BITS Pilani)机械工程专业。此后一直在BigVision LLC从事深度学习和计算机视觉方面的工作,还参与了官方OpenCV课程的创建。
迈克尔·贝耶勒(Michael Beyeler),是华盛顿大学神经工程和数据科学的博士后研究员,致力于仿生视觉的计算模型研究,以为盲人植入人工视网膜(仿生眼睛),改善盲人的感知体验。他的工作属于神经科学、计算机工程、计算机视觉和机器学习的交叉领域。
本文摘编自《机器学习:使用OpenCV、Python和scikit-learn进行智能图像处理(原书第2版)》,经出版方授权发布。
延伸阅读《机器学习》(原书第2版)
点击上图了解及购买
转载请联系微信:DoctorData
推荐语:一本基于OpenCV4和Python的机器学习实战手册,既详细介绍机器学习及OpenCV相关的基础知识,又通过具体实例展示如何使用OpenCV和Python实现各种机器学习算法,并提供大量示例代码,可以帮助你掌握机器学习实用技巧,解决各种不同的机器学习和图像处理问题。
更多精彩👇
在公众号对话框输入以下关键词查看更多优质内容!
PPT | 读书 | 书单 | 硬核 | 干货 | 讲明白 | 神操作大数据 | 云计算 | 数据库 | Python | 爬虫 | 可视化AI | 人工智能 | 机器学习 | 深度学习 | NLP5G | 中台 | 用户画像 | 1024 | 数学 | 算法 | 数字孪生
据统计,99%的大咖都关注了这个公众号👇